package com.dawan.sbjy.common;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Auther: shigc
 * @Date: 2018/12/15 11:53
 * @Description: websocket
 */
@ServerEndpoint("/websocket/{pageCode}")
@Component
public class WebSocket {
    private int count=0;
    private static final String loggerName=WebSocket.class.getName();
    //concurrent包的线程安全Set，用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话，可以使用Map来存放，其中Key可以为用户标识
    public static Map<String, List<Session>> electricSocketMap = new ConcurrentHashMap<String, List<Session>>();
    public static HashMap<String,HashMap> userpositondataMap = new HashMap<String,HashMap>();
    public static HashMap<String,HashMap> driverpositondataMap = new HashMap<String,HashMap>();

    /**
     * 连接建立成功调用的方法
     *
     * @param session 可选的参数。session为与某个客户端的连接会话，需要通过它来给客户端发送数据
     */
    @OnOpen
    public void onOpen(@PathParam("pageCode") String pageCode, Session session) {
        List<Session> sessions = electricSocketMap.get(pageCode);
        if(null==sessions){
            List<Session> sessionList = new ArrayList<>();
            sessionList.add(session);
            electricSocketMap.put(pageCode,sessionList);
        }else{
            sessions.add(session);
        }
        if(pageCode.equals("2")){
            driverpositondataMap.put(session.getId(),new HashMap<String,String>());
        }else{
            userpositondataMap.put(session.getId(),new HashMap<String,String>());
        }

    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(@PathParam("pageCode") String pageCode,Session session) {
        if (electricSocketMap.containsKey(pageCode)){
            electricSocketMap.get(pageCode).remove(session);

        }
        if(pageCode=="2"){
            driverpositondataMap.remove(session.getId());
        }else{
            userpositondataMap.remove(session.getId());
        }
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     * @param session 可选的参数
     */
    @OnMessage
    public void onMessage(String message, Session session,@PathParam("pageCode") String pageCode) {
        count++;
        System.out.println("websocket received message:"+message);
//        如果是司机，将司机位置保存，并返回用户位置

        //如果使用户，将用户位置进行保存，并返回司机位置
        try {
            JSONObject res= JSONObject.parseObject(message);
            if(Integer.parseInt(pageCode)==2){
                driverpositondataMap.get(session.getId()).put("latitude",Float.parseFloat(res.getString("latitude")));
                driverpositondataMap.get(session.getId()).put("longitude",Float.parseFloat(res.getString("longitude")));
                String messagestr=JSONObject.toJSONString(userpositondataMap);
                session.getBasicRemote().sendText(messagestr);
            }else{
                userpositondataMap.get(session.getId()).put("latitude",Float.parseFloat(res.getString("latitude")));
                userpositondataMap.get(session.getId()).put("longitude",Float.parseFloat(res.getString("longitude")));
//                String messagestr=JSONObject.toJSONString(driverpositondataMap);
//                session.getBasicRemote().sendText(messagestr);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 发生错误时调用
     *
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发生错误");;
    }
}
